public: void PipeCalcMain2( PaintEventArgs^ e )
{
Int32 ClMax, ClCnt, ClCnt1;
Int32 i, j, n, dan;
Int32 N1;
float D1;
float X, Y, R, R1, R2, R3, R4;
float X0, Y0, X1, Y1;
float Th, Th1, Th2, Th3, Th4, Th5, Th6, Th7;
float Pai, Pai2;
ClMax = 0; ClCnt = 0; ClCnt1 = 0;
for ( i = 0; i < 20; i++ )
{ ClData[i].R = 0; ClData[i].Rc = 0; ClData[i].Ts = 0; ClData[i].Te = 0; ClData[i].N = 0; ClData[i].P = -1; }
ClData[0].N = 0;
Pai = 4.0F * atan(1.0F); Pai2 = Pai + Pai;
Th = 0.0; Th1 = 0.0; Th2 = 0.0; Th3 = 0.0; Th4 = 0.0; Th5 = 0.0; Th6 = 0.0; Th7 = 0.0;
D1 = 0.0;
X0 = 150.0; Y0 = 100.0; X1 = X0; Y1 = Y0;
R1 = 0.0; R2 = 0.0; R3 = 0.0; R4 = 0.0;
n = 1; dan = 0;
for ( i = 0; i < DataMax; i++ )
{
D1 = InData[i].D;
N1 = InData[i].N;
R = D1 * 0.5F;
if ( dan > 0 && ( InData[0].N != 1 || i != 1 ) )
{
ClCnt1 = ClData[ClCnt].P; if ( ClCnt1 < 0 ) ClCnt1 = 0;
R2 = ClData[ClCnt1].R; R3 = ClData[ClCnt1].Rc; R4 = R3 + 2 * R2;
Th3 = ClData[ClCnt1].Ts;
Th4 = 2 * asin( 0.5F * R2 / ( R3 + R2 ) );
Th5 = 2 * asin( 0.5F * R / ( R4 + R ) );
Th6 = 2 * asin( 0.5F * R / ( R1 + D1 + R ) );
Th7 = Th3 - Th4 - Th5; if ( Th7 < 0 ) Th7 = Pai2 + Th7;
if ( ( Th2 + 2 * Th ) < Th7 )
{
ClMax += 1;
ClData[ClMax].R = R;
ClData[ClMax].Rc = R1;
ClData[ClMax].Ts = Th1 - Th + Th6;
ClData[ClMax].N = 0;
ClData[ClMax].P = ClData[ClCnt].P;
ClData[ClCnt].P = ClMax;
ClCnt = ClMax;
}
else
{
ClCnt = ClData[ClCnt].P;
if ( ClCnt < 0 ) ClCnt = 0;
}
}
if ( n == 1 ) { R1 = R; n = 2; }
if ( InData[0].N == 1 && dan == 1 ) R1 = R1; else R1 = ClData[ClCnt].Rc;
Th1 = ClData[ClCnt].Ts;
for ( j = 1; j <= N1; j++ )
{
if ( i == 0 && j == 1 )
{
X = X0;
Y = Y0;
R1 = R;
ClData[ClCnt].R = R; ClData[ClCnt].Rc = R; ClData[ClCnt].Ts = Th1;
ClData[ClCnt].N = 1; ClData[ClCnt].P = -1; ClMax = ClCnt;
dan += 1;
CircleDraw1( X, Y , R, e );
}
else
{
X1 = ( R1 + R ) * cos( Th1 );
Y1 = ( R1 + R ) * sin( Th1 );
if ( ClData[ClCnt].Rc != R1 ) ClData[ClCnt].Rc = R1;
if ( ClData[ClCnt].R != R ) ClData[ClCnt].R = R;
X = X1 + X0;
Y = Y1 + Y0;
CircleDraw1( X, Y , R, e );
ClData[ClCnt].N += 1;
Th = 2 * asin( 0.5F * R / ( R1 + R ) );
Th2 = Th1;
Th1 += 2 * Th;
ClCnt1 = ClData[ClCnt].P; if ( ClCnt1 < 0 ) ClCnt1 = 0;
R2 = ClData[ClCnt1].R; R3 = ClData[ClCnt1].Rc; R4 = R3 + 2 * R2;
Th3 = ClData[ClCnt1].Ts;
Th4 = 2 * asin( 0.5F * R2 / ( R3 + R2 ) );
Th5 = 2 * asin( 0.5F * R / ( R4 + R ) );
Th6 = 2 * asin( 0.5F * R / ( R1 + D1 + R ) );
Th7 = Th3 - Th4 - Th5; if ( Th7 < 0 ) Th7 = Pai2 + Th7;
if ( ( Th2 + 2 * Th ) > Th7 )
{
if ( ( R1 + 2 * D1 ) <= ( R3 + 2 * R2 ) )
{
R1 += D1;
ClData[ClCnt].R = R; ClData[ClCnt].Rc = R1; ClData[ClCnt].N = 0;
Th3 = 2 * asin( 0.5F * R / ( R1 + R ) );
Th1 = ClData[ClCnt].Ts - Th + Th3;
ClData[ClCnt].Ts = Th1;
}
else
{
dan += 1;
ClCnt = ClData[ClCnt].P; if ( ClCnt < 0 ) ClCnt = 0;
R1 = ClData[ClCnt].Rc + 2 * ClData[ClCnt].R;
Th1 = ClData[ClCnt].Ts;
}
}
}
}
}
}